package com.cata.mall;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

import java.util.Properties;

/**
 * @作者: Tao
 * @日期: 2025/10/10
 * @时间: 16:37
 * @描述: 自定义注释生成器<pre>
 *     当Mybatis生成器生成Java文件时，会调用此类中的方法为生成的文件添加Swagger相关注释。
 */
public class CommentGenerator extends DefaultCommentGenerator {

    /**
     * 是否添加备注注释的标志位
     * true表示需要添加备注注释，false表示不需要添加
     */
    private boolean addRemarkComments = false;

    /**
     * 示例类名后缀常量
     * 用于标识示例类的命名后缀
     */
    private static final String EXAMPLE_SUFFIX = "Example";

    /**
     * Mapper类名后缀常量
     * 用于标识Mapper接口的命名后缀
     */
    private static final String MAPPER_SUFFIX = "Mapper";

    /**
     * Swagger ApiModelProperty注解的完整类名
     * 用于在代码中引用Swagger的ApiModelProperty注解
     */
    private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.annotations.ApiModelProperty";


    /**
     * 添加配置属性
     *
     * @param properties 配置属性集合，包含各种配置参数
     */
    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        // 从配置属性中获取addRemarkComments参数值，并转换为布尔类型
        this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
    }

    /**
     * 为模型字段添加注释和Swagger注解
     *
     * @param field              Java字段对象，用于添加注释和注解
     * @param introspectedTable  数据库表的内省信息
     * @param introspectedColumn 数据库列的内省信息，包含列的备注等信息
     */
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                                IntrospectedColumn introspectedColumn) {
        String remarks = introspectedColumn.getRemarks();
        //根据参数和备注信息判断是否添加swagger注解信息
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
//            addFieldJavaDoc(field, remarks);
            //数据库中特殊字符需要转义
            if (remarks.contains("\"")) {
                remarks = remarks.replace("\"", "'");
            }
            //给model的字段添加swagger注解
            field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\")");
        }
    }

    /**
     * 为字段添加Java文档注释
     *
     * @param field   需要添加注释的字段对象
     * @param remarks 字段的备注信息
     */
    private void addFieldJavaDoc(Field field, String remarks) {
        //文档注释开始
        field.addJavaDocLine("/**");
        //获取数据库字段的备注信息并按行分割
        String[] remarkLines = remarks.split(System.getProperty("line.separator"));
        for (String remarkLine : remarkLines) {
            field.addJavaDocLine(" * " + remarkLine);
        }
        addJavadocTag(field, false);
        field.addJavaDocLine(" */");
    }

    /**
     * 为Java文件添加注释
     *
     * @param compilationUnit 编译单元对象，用于表示整个Java源文件
     */
    @Override
    public void addJavaFileComment(CompilationUnit compilationUnit) {
        super.addJavaFileComment(compilationUnit);
        //只在model中添加swagger注解类的导入
        if (!compilationUnit.getType().getFullyQualifiedName().contains(MAPPER_SUFFIX) && !compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)) {
            compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
        }
    }

}
